﻿/*
 * Разработчик: Коледа Андрей
 * Дата: 20.01.2011
 * Время: 16:10
 * Email: koleda.andrey@gmail.com
 */
using System.Collections.Generic;
using System.Linq;
using FastTravel.DataAccess.Base;
using FastTravel.DataAccess.Interface;
using FastTravel.DB;
using StructureMap;

namespace FastTravel.BusinessLogic
{
	/// <summary>
	/// Управление странами
	/// </summary>
	public class CountryManager
	{
		/// <summary>
		/// Хранилище стран
		/// </summary>
		private static IRepository<Country> CountryRepository
		{
			get{return ObjectFactory.GetInstance<IRepository<Country>>();}
		}

		/// <summary>
		/// Создать страну
		/// </summary>
		/// <param name="name">Название страны</param>
		/// <param name="code">Код страны</param>
		/// <param name="iso">ISO код</param>
		/// <returns>Страна</returns>
		public static Country Add(string name, string code, int iso)
		{
			if (!string.IsNullOrWhiteSpace(name))
			{
				var country = new Country {Name = name, Code = code, ISO = iso};
				CountryRepository.Add(country);
				return country;
			}
			return null;
		}
		
		/// <summary>
		/// Добавить курорт для страны
		/// </summary>
		/// <param name="id">ID страны</param>
		/// <param name="resort">Курорт</param>
		/// <returns>Курорт</returns>
		public static Resort AddResort(int id, Resort resort)
		{
			if (resort != null)
			{
				var country = CountryRepository.Single(x => x.ID == id);
				if (country != null)
				{
					country.Resort.Add(resort);
					return resort;
				}
			}
			return null;
		}
		
		/// <summary>
		/// Получить страну
		/// </summary>
		/// <param name="id">ID страны</param>
		/// <returns>Страна</returns>
		public static Country Get(int id)
		{
			return CountryRepository.Single(x => x.ID == id);
		}

		/// <summary>
		///  Получить страницу стран
		/// </summary>
		/// <param name="start">Начальная страница</param>
		/// <param name="limit">Размер страницы</param>
		/// <param name="sort">Сортировка по полю</param>
		/// <param name="dir">Направление сортировки</param>
		/// <param name="count">Общее число стран</param>
		/// <returns>Список стран</returns>
		public static List<Country> GetPage(int start, int limit, string sort, string dir, out int count)
		{
			return CountryRepository.GetPage(start, limit, sort, dir, out count);
		}

		/// <summary>
		/// Получить страницу стран
		/// </summary>
		/// <param name="start">Начальная страница</param>
		/// <param name="limit">Размер страницы</param>
		/// <param name="sort">Сортировка по полю</param>
		/// <param name="dir">Направление сортировки</param>
		/// <param name="name">Фильтр по названию</param>
		/// <param name="code">Фильтр по коду</param>
		/// <param name="iso">Фильтр по ISO-коду</param>
		/// <param name="count">Общее количество</param>
		/// <returns>Страны</returns>
		public static List<Country> GetPage(int start, int limit, string sort, string dir, string name, string code, string iso, out int count)
		{
			var query = CountryRepository.GetQuery().Select(e => e);

			if (!string.IsNullOrEmpty(name))
			{
				query = query.Where(x => x.Name.ToLower().StartsWith(name.ToLower()));
			}

			if (!string.IsNullOrEmpty(code))
			{
				query = query.Where(x => x.Code.ToLower().StartsWith(code.ToLower()));
			}

			if (!string.IsNullOrEmpty(iso))
			{
				query = query.Where(x => x.ISO.ToString().StartsWith(iso.ToLower()));
			}

			count = query.Count();

			if (!string.IsNullOrEmpty(sort))
			{
				query = dir == "ASC"
							? CountryRepository.SortByQuery<Country>(query, sort, true)
							: CountryRepository.SortByQuery<Country>(query, sort, false);
			}

			if (start >= 0 && limit > 0)
			{
				query = query.Skip(start).Take(limit);
			}
			return query.ToList();
		}

		/// <summary>
		/// Получить все страны
		/// </summary>
		/// <returns>Список стран</returns>
		public static IEnumerable<Country> GetAll()
		{
			return CountryRepository.GetAll();
		}
		
		/// <summary>
		/// Получить общее количество стран
		/// </summary>
		/// <returns>Количество стран</returns>
		public static int Count()
		{
			return CountryRepository.GetQuery().Count();
		}
		
		/// <summary>
		/// Удалить страну
		/// </summary>
		/// <param name="id">ID</param>
		public static void Delete(int id)
		{
			Country country = CountryRepository.Single(x => x.ID == id);
			if (country != null)
			{
				CountryRepository.Delete(country);
			}
		}

		/// <summary>
		/// Обновить данные о стране
		/// </summary>
		/// <param name="countryId">ID страны</param>
		/// <param name="name">Название</param>
		/// <param name="code">Код</param>
		/// <param name="iso">Код ISO</param>
		public static void Update(int countryId, string name, string code, int iso)
		{
			Country country = CountryRepository.Single(x => x.ID == countryId);
			if (country != null)
			{
				country.Name = name;
				country.ISO = iso;
				country.Code = code;
				CountryRepository.SaveChanges();
			}
		}

		/// <summary>
		/// Проверка страны на сущестование
		/// </summary>
		/// <param name="name">Название страны</param>
		/// <returns>TRUE - если существует</returns>
		public static bool IsExsist(string name)
		{
			Country country = CountryRepository.GetQuery().First(x => x.Name.Trim().ToLower() == name.Trim().ToLower());
			return country != null;
		}

		/// <summary>
		/// Проверка на сущестование куроротов в стране
		/// </summary>
		/// <param name="countryId">ID страны</param>
		/// <returns>TRUE - если существует</returns>
		public static bool HasResort(int countryId)
		{
			int resortCount = CountryRepository.GetQuery().Where(c => c.Resort.Any(x => x.Country.ID == countryId)).Count();
			return resortCount > 0;
		}
	}
}
